from flask import Flask, request, jsonify, abort
from flask_cors import CORS
import json
import os
from datetime import datetime

app = Flask(__name__)
CORS(app)  # 允许跨域请求

DATA_FILE = os.path.join(os.path.dirname(__file__), 'todos.json')

def load_todos():
    if not os.path.exists(DATA_FILE):
        return []
    with open(DATA_FILE, 'r', encoding='utf-8') as f:
        return json.load(f)

def save_todos(todos):
    with open(DATA_FILE, 'w', encoding='utf-8') as f:
        json.dump(todos, f, indent=2, ensure_ascii=False)

def validate_todo_data(data):
    """验证待办事项数据"""
    if not data or 'text' not in data or not data['text'].strip():
        return False, "任务内容不能为空"
    
    if 'priority' in data and data['priority'] not in ['高', '中', '低']:
        return False, "优先级必须是：高、中、低"
    
    if 'due_date' in data and data['due_date']:
        try:
            datetime.fromisoformat(data['due_date'])
        except ValueError:
            return False, "日期格式不正确"
    
    return True, None

@app.route('/api/todos', methods=['GET'])
def get_todos():
    return jsonify(load_todos())

@app.route('/api/todos', methods=['POST'])
def add_todo():
    data = request.get_json()
    
    # 验证数据
    is_valid, error_msg = validate_todo_data(data)
    if not is_valid:
        return jsonify({'error': error_msg}), 400
    
    todos = load_todos()
    new_todo = {
        'id': max([todo['id'] for todo in todos], default=0) + 1,
        'text': data['text'].strip(),
        'completed': False,
        'priority': data.get('priority', '中'),
        'due_date': data.get('due_date'),
        'created_at': datetime.now().isoformat(),
        'updated_at': datetime.now().isoformat()
    }
    todos.append(new_todo)
    save_todos(todos)
    return jsonify(new_todo), 201

@app.route('/api/todos/<int:todo_id>', methods=['DELETE'])
def delete_todo(todo_id):
    todos = [todo for todo in load_todos() if todo['id'] != todo_id]
    save_todos(todos)
    return jsonify({'message': 'Todo deleted'})

@app.route('/api/todos/<int:todo_id>', methods=['PUT'])
def toggle_todo(todo_id):
    todos = load_todos()
    for todo in todos:
        if todo['id'] == todo_id:
            todo['completed'] = not todo['completed']
            todo['updated_at'] = datetime.now().isoformat()
            break
    else:
        return jsonify({'error': '任务不存在'}), 404
    
    save_todos(todos)
    return jsonify({'message': '状态已更新'})

@app.route('/api/todos/<int:todo_id>/update', methods=['PUT'])
def update_todo(todo_id):
    data = request.get_json()
    
    # 验证数据
    is_valid, error_msg = validate_todo_data(data)
    if not is_valid:
        return jsonify({'error': error_msg}), 400
    
    todos = load_todos()
    for todo in todos:
        if todo['id'] == todo_id:
            todo['text'] = data['text'].strip()
            todo['priority'] = data.get('priority', todo.get('priority', '中'))
            todo['due_date'] = data.get('due_date')
            todo['updated_at'] = datetime.now().isoformat()
            break
    else:
        return jsonify({'error': '任务不存在'}), 404
    
    save_todos(todos)
    return jsonify({'message': '任务已更新', 'todo': todo})

if __name__ == '__main__':
    app.run(port=5000, debug=True)